package com.yokmama.learn10.chapter04.lesson16.fragment; import android.graphics.ColorFilter; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.RadioGroup; import android.widget.SeekBar; import com.yokmama.learn10.chapter04.lesson16.R; /** * A simple {@link Fragment} subclass. */ public class ImageViewFragment extends Fragment { private RadioGroup mRadioFilterType; private ImageView mImageColorFilter; private SeekBar mSeekBarRed; private SeekBar mSeekBarGreen; private SeekBar mSeekBarBlue; //SeekBarの値が変更された事を受け取るリスナー private SeekBar.OnSeekBarChangeListener colorBarChangeListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) { //カラーフィルターを更新 updateColorFilter(mRadioFilterType); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } }; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_image_view, container, false); //RadioGroup,ImageView,SeekBarのインスタンスを取得 mRadioFilterType = (RadioGroup) rootView.findViewById(R.id.radioFilterType); mImageColorFilter = (ImageView) rootView.findViewById(R.id.imageColorFilter); mSeekBarRed = (SeekBar) rootView.findViewById(R.id.seekBarRed); mSeekBarGreen = (SeekBar) rootView.findViewById(R.id.seekBarGreen); mSeekBarBlue = (SeekBar) rootView.findViewById(R.id.seekBarBlue); //リスナーをセット mRadioFilterType.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { //カラーフィルターを更新 updateColorFilter(group); } }); mSeekBarRed.setOnSeekBarChangeListener(colorBarChangeListener); mSeekBarGreen.setOnSeekBarChangeListener(colorBarChangeListener); mSeekBarBlue.setOnSeekBarChangeListener(colorBarChangeListener); updateColorFilter(mRadioFilterType); return rootView; } /** * カラーフィルターを更新. */ private void updateColorFilter(RadioGroup radioGroup) { if (radioGroup.getCheckedRadioButtonId() == R.id.radioColor) { setColorFilter(mImageColorFilter, ((float) mSeekBarRed.getProgress()) / 255, ((float) mSeekBarGreen.getProgress()) / 255, ((float) mSeekBarBlue.getProgress()) / 255); } else { setGrayScale(mImageColorFilter); } } /** * グレースケールをセット. * * @param imageView 対象のImageView */ private void setGrayScale(ImageView imageView) { ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0); ColorMatrixColorFilter filter = new ColorMatrixColorFilter(colorMatrix); imageView.setColorFilter(filter); } /** * カラーフィルターをセット. * * @param imageView 対象のImageView * @param red Redの値 * @param green Greenの値 * @param blue Blueの値 */ private void setColorFilter(ImageView imageView, float red, float green, float blue) { float[] colorMatrix = { (1.0f - red), 0, 0, 0, 0, //red 0, (1.0f - green), 0, 0, 0,//green 0, 0, (1.0f - blue), 0, 0, //blue 0, 0, 0, 1, 0 //alpha }; ColorFilter filter = new ColorMatrixColorFilter(colorMatrix); imageView.setColorFilter(filter); } }